[Serverless Framework] Java + gradle のLambda Functionを作成する
はじめに
前回、Serverless ApplicationをJavaで作成する手段としてAWS Toolkit for Eclipse で Serverless Applicationを作成するという記事を書きました。この方法はEclipseからGUIで操作できることが特徴ですが、使用するライブラリの管理は標準のEclipseプロジェクトと同じ方式のようです。
今回はServerless Frameworkを用いてLambda FunctionをGradleプロジェクトとして作成し、Gradleでライブラリを管理する方法を試してみました。
プロジェクトの作成
先にも書いたようにServerless Frameworkを使用します。このフレームワークはnpmでインストールするため、Javaの他にnpmの実行環境も必要となります。以下、プロジェクトの作成手順となります。
1.Serverless Frameworkのインストール
プロジェクトを作成したいフォルダに移動し、以下のコマンドでServerless Frameworkをインストールします。私は好みでローカルフォルダ内にインストールしましたが、グローバル領域にインストールしたい場合は -g を付けて下さい。
$ npm install serverless
2.プロジェクトの作成
以下のコマンドでプロジェクトを作成します。
$ ./node_modules/.bin/serverless create --template aws-java-gradle Serverless: Generating boilerplate... _______ __ | _ .-----.----.--.--.-----.----| .-----.-----.-----. | |___| -__| _| | | -__| _| | -__|__ --|__ --| |____ |_____|__| \___/|_____|__| |__|_____|_____|_____| | | | The Serverless Application Framework | | serverless.com, v1.3.0 -------' Serverless: Successfully generated boilerplate for template: "aws-java-gradle" Serverless: NOTE: Please update the "service" property in serverless.yml with your service name
3.serverless.ymlの修正
上記のプロジェクト作成時の結果にも出ているように、サービス名を修正することにします。またステージとリージョンについても修正しました。修正したserverless.ymlは以下のようになります。
# Welcome to Serverless! # # This file is the main config file for your service. # It's very minimal at this point and uses default values. # You can always add more config options for more control. # We've included some commented out config examples here. # Just uncomment any of them to get that config option. # # For full config options, check the docs: # docs.serverless.com # # Happy Coding! service: serverless-lambda-sample # NOTE: update this with your service name # You can pin your service to only deploy with a specific Serverless version # Check out our docs for more details # frameworkVersion: "=X.X.X" provider: name: aws runtime: java8 # you can overwrite defaults here # stage: dev # region: us-east-1 stage: dev region: ap-northeast-1 (以降略)
デプロイ
作成したプロジェクトには雛形のソースが記述されています。まずは何も修正しないでデプロイしてみたいと思います。
1.ビルド
デプロイする前にビルドを行う必要があります。今回はEclipseのメニューよりGradleのビルドを行いました。
2.デプロイ
以下のコマンドでデプロイを行います。
$ ./node_modules/.bin/serverless deploy (中略) Service Information service: serverless-lambda-sample stage: dev region: ap-northeast-1 api keys: None endpoints: None functions: serverless-lambda-sample-dev-hello: arn:aws:lambda:ap-northeast-1:xxxxxxxxxx:function:serverless-lambda-sample-dev-hello
CloudFormationが実行され、作成されたLambda FunctionのARNが出力されます。以下、CloudFormationとLambda Functionのスクリーンショットです。
CloudFormation
Lambda Function
Gradleにてライブラリの追加
先ほどのプロジェクトのGradleファイルにライブラリを追加してみます。今回はLombokを追加してみました。
1.build.gradle
build.gradleのLombokを追加します。以下のようになりました。
apply plugin: 'java' repositories { mavenCentral() } dependencies { compile ( 'com.amazonaws:aws-lambda-java-core:1.1.0', 'com.amazonaws:aws-lambda-java-events:1.3.0' ) compile('org.projectlombok:lombok:1.16.12') } (以降略)
2.プログラム変更
Lombokを追加したので、プログラムを変更して利用してみたいと思います。Getter・Setterのみのクラスが雛形にあったので、それをLombokの@Dataを使用するよう変更しました。
(変更前)Request.java
package hello; public class Request { private String key1; private String key2; private String key3; public Request() { } public String getKey1() { return key1; } public String getKey2() { return key2; } public String getKey3() { return key3; } public void setKey1(String key1) { this.key1 = key1; } public void setKey2(String key2) { this.key2 = key2; } public void setKey3(String key3) { this.key3 = key3; } }
(変更後)Request.java
package hello; import lombok.Data; @Data public class Request { private String key1; private String key2; private String key3; }
3.ビルド
プログラムを変更後にGradleのビルドを行います。
4.デプロイ
以下のコマンドでデプロイを行います。
$ ./node_modules/.bin/serverless deploy
まとめ
今回はLambda Functionだけデプロイしましたが、設定を変更することによりAPI Gateway + Lambdaのデプロイも出来るようです。JavaでLambdaを開発する場合、AWS Toolkit for Eclipseと同じく、1つの選択肢になるのではないかと思います。